package com.info33.platform.system.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.info33.platform.business.app.vo.AppCenterVO;
import com.info33.platform.common.mvc.vo.Result;
import com.info33.platform.system.dto.SysTenantUserDTO;
import com.info33.platform.system.dto.SysUserDTO;
import com.info33.platform.system.entity.SysUser;
import com.info33.platform.system.vo.SysUserDetailVO;
import com.info33.platform.system.vo.SysUserPerfect;
import com.info33.platform.system.vo.SysUserVO;

import java.util.List;

/**
 * @author admin
 */
public interface SysUserService extends IService<SysUser> {

    /**
     * 重置某人密码
     *
     * @param dto-
     * @return -
     */
    Result<Object> pcResetPassWord(SysTenantUserDTO dto);

    /**
     * pc - 修改密码
     *
     * @param dto-
     * @param currentUser-
     * @return -
     */
    Result<Object> pcChangePassword(SysUserDTO dto, SysUserVO currentUser);

    /**
     * pc - 获取某部门下用户
     *
     * @param page-
     * @param dto-
     * @param currentUser-
     * @return -
     */
    Page<SysUserVO> getUserListByDeptId(Page<SysUser> page, SysUserDTO dto, SysUserVO currentUser);

    /**
     * 获取租户下的所有用户
     *
     * @param page
     * @param dto
     * @param currentUser
     * @return
     */
    Page<SysUserDetailVO> getAllUser(Page<SysUser> page, SysUserDTO dto, Long tenantId);

    /**
     * 新增系统用户信息
     *
     * @param sysUserDTO
     * @param tenantId   租户id
     * @return
     */
    Result<?> saveUser(SysUserDTO sysUserDTO, Long tenantId);

    /**
     * 更新系统用户信息
     *
     * @param sysUserDTO
     * @param tenantId   租户id
     * @return
     */
    Result<?> editUser(SysUserDTO sysUserDTO, Long tenantId);

    /**
     * 获取用户信息详情
     *
     * @param id
     * @return
     */
    SysUserDetailVO getUserDetail(Long id);

    /**
     * pc - 用户基础信息
     *
     * @param sysCurrentUser-
     * @return -
     */
    SysUserVO pcBaseInfo(SysUserVO sysCurrentUser);

    /**
     * 分页获取用户（不包含ADMIN用户）
     *
     * @param page
     * @param dto
     * @param sysCurrentUser
     * @return
     */
    Page<SysUserVO> specificUserList(Page<SysUser> page, SysUserDTO dto, SysUserVO sysCurrentUser);

    /**
     * pc - 用户详情
     *
     * @param sysCurrentUser-
     * @return -
     */
    SysUserVO pcDetail(SysUserVO sysCurrentUser);

    /**
     * 根据用户id查询同级别部门id及上级部门id
     *
     * @param tenantId 租户id
     * @param userId   用户id
     * @return
     */
    List<String> queryUserSameLevelDeptAndParent(Long userId, Long tenantId);

    List<SysUserDetailVO> getUserDetailList(String id);

    /**
     * 用户注册<br/>
     * 1.若 id 不为 null，则直接返回
     * 2.若旧数据存在，则会判断登录名是否变更，若变更则进行更新
     *
     * @param dto 手机号必须存在
     * @return sys_user id
     */
    SysUser register(SysUserDTO dto);

    /**
     * app - 个人中心
     *
     * @param id 当前用户 租户用户 id
     * @return -
     */
    AppCenterVO appCenter(Long id);

    /**
     * 修改手机号
     *
     * @param dto         入参
     * @param currentUser 当前用户
     * @return object
     */
    Result<Object> changeMobile(SysUserDTO dto, SysUserVO currentUser);

    /**
     * 发送验证码
     *
     * @param dto 入参
     * @return object
     */
    Result<Object> pushCode(SysUserDTO dto);

    /**
     * 修改密码，通过验证码修改
     *
     * @param dto 入参
     * @return object
     */
    Result<Object> changePasswordByCode(SysUserDTO dto);

    /**
     * app 用户基础信息回显\
     *
     * @param dto         入参
     * @param currentUser 当前用户
     * @return vo
     */
    SysUserPerfect pcBaseEcho(SysUserDTO dto, SysUserVO currentUser);

    /**
     * mapp 个人中心
     *
     * @param currentUser 当前用户
     * @return entity
     */
    SysUser mAppCenter(SysUserVO currentUser);

    /**
     * 修改手机号
     *
     * @param n 新手机号
     * @param o 旧手机号
     */
    void updateOneWithMobile(String n, String o);

    /**
     * 修改登录名
     *
     * @param n 新登录名
     * @param o 旧登录名
     */
    void updateOneWithLoginName(String n, String o);

    /**
     * 检测登录名是否已存在
     *
     * @param dto         入参
     * @param currentUser 当前用户
     * @return object
     */
    Result<Object> checkLoginName(SysUserDTO dto, SysUserVO currentUser);

    /**
     * 获取用户详情
     *
     * @param userId 用户 id
     * @return vo
     */
    SysUserVO pcEditEcho(Long userId);

    /**
     * 清除密码错误提示
     *
     * @param userId 用户 id
     * @return -
     */
    Result<Object> pcClearPwdErr(Long userId);
}